package org.apache.ibatis.test.plugins;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;


/**
 * All rights Reserved, Designed By www.super-bytecode.com
 *
 * @ProjectName: source-mybatis3.5.8
 * @Package: org.apache.ibatis.test.plugins
 * @ClassName: DefaultPlugins
 * @Description: []
 * <p> </p>
 * @Author: [Lance Ting]
 * @Date: 2023/12/26 15:00
 * @Version: V1.0
 * @Copyright: 2023 www.super-bytecode.com Inc. All rights reserved.
 * TODO: 注意,本文件Lance Ting所作,如果转载或使用请标明具体出处!
 **/
@Intercepts({@Signature(
  // 需要拦截的类，即四大类Executor、StatementHandler、ParameterHandler、ResultSetHandler
  type = Executor.class,
  // 需要拦截方法名称，支持四大类中存在的方法
  method = "query",
  // Class数组，设置拦截方法的参数类型。
  // 由于同一类下存在同名不同参数的重载方法，只设置方法名称还不能确定拦截的是哪个方法，将方法参数类型也设置后即可确定具体的拦截方法。
  args = {MappedStatement.class, Object.class,RowBounds.class,ResultHandler.class})
})
public class DefaultPlugins implements Interceptor {

  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    System.out.println("进入Executor拦截代码");
    // 调用target对象，由于存在多个插件类的情况，所以target对象可能还是插件代理对象
    // 若果是多个对象则调用会进行Plugin类的invoke,判断下一个插件类是否执行intercept
    Object returnObject = invocation.proceed();
    System.out.println("结束Executor拦截代码");
    return returnObject;
  }
}





